package com.bobo.utis;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 
 * @ClassName: StringUtil
 * @Description: 字符串工具类
 * @author: charles
 * @date: 2020年12月14日 下午4:27:32
 */
public class StringUtil {
	
	/*
	* 方法功能：根据正则在字符串提取一段值，用于后面在url地址里提取ID值。
	* 例如在“http://news.cnstock.com/news,yw-201908-4413224.htm”把“4413224”提取出来。
	* 案例调用：
	*  StringUtil.getPlaceholderValue(src,"\\d+(?=[^\\d+]*$)");
	*  
	*  // 前瞻：
		exp1(?=exp2) 查找exp2前面的exp1
		// 后顾：
			(?<=exp2)exp1 查找exp2后面的exp1
		// 负前瞻：
		exp1(?!exp2) 查找后面不是exp2的exp1
		// 负后顾：
		(?<!exp2)exp1 查找前面不是exp2的exp1
	*/
	public static String getPlaceholderValue(String src, String regex){
		
		Pattern p = Pattern.compile(regex);//编译规则
		Matcher matcher = p.matcher(src);
		if(matcher.find()) {//如果按规则能找到
			return matcher.group();
		}
		return null;
	}
	


	/**
	 * 功能：检查包含空白字符在内的字符系列长度 示例： StringUtil.hasLength(null) -> false
	 * StringUtil.hasLength("") -> false StringUtil.hasLength(" ") -> true
	 * StringUtil.hasLength("Hello") -> true
	 */
	public static boolean hasLength(String src) {

		if (null != src && src.length() > 0)
			return true;
		return false;
	}

	/**
	 * 功能：检查包含空白字符在内的字符系列长度，并处理过滤前后空格 示例： StringUtil.hasText(null) -> false
	 * StringUtil.hasText("") -> false StringUtil.hasText(" ") -> false
	 * StringUtil.hasText("Hello") -> true
	 */
	public static boolean hasText(String src) {
		if (null != src && src.trim().length() > 0)
			return true;
		return false;
	}

	/**
	 * 功能：验证是否为合格邮箱 示例： StringUtil.isEmail(null) -> false StringUtil.isEmail("") ->
	 * false StringUtil.isEmail("zhangjihao@") -> false
	 * StringUtil.isEmail("zhangjihao@sohu") -> false
	 * StringUtil.isEmail("zhangjihao@sohu.com") -> true
	 */
	public static boolean isEmail(String email) {
		if (!hasText(email))
			return false;
		// 正则
		String regex = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
		return email.matches(regex);
	}

	/**
	 * 功能：验证是否为合格手机号 示例： StringUtil.isPhone(null) -> false StringUtil.isPhone("") ->
	 * false StringUtil.isPhone("14312039428") -> false
	 * StringUtil.isPhone("13900139000") -> true
	 */
	public static boolean isPhone(String src) {
		if(!hasText(src))
		 return false;
		String regex="^1[345678]\\d{9}$";
		return 	src.matches(regex);
	}

	/**
	 * 功能：判断是否全部为字母 示例： StringUtil.isLetter(null) -> false StringUtil.isLetter("")
	 * -> false StringUtil.isLetter(".com") -> false StringUtil.isLetter("howSun")
	 * -> true
	 */
	public static boolean isLetter(String src) {
		if(!hasText(src))
			 return false;
		String regex="[a-zA-Z]+";
		return src.matches(regex);
	}

	/**
	 * 功能：反转字符串 示例："abcd" → "dcba"
	 *
	 * 参数1：src，源字符串 返回值：反转的字符串
	 */
	public static String reverse(String src) {
		if(!hasText(src))
			 return "参数不能为空";
		return  new StringBuffer(src).reverse().toString();
	}

	/**
	 * 功能：隐藏字符串 示例：StringUtil.hidden("13856237928", 3,7) -> "138****7928"
	 * 参数1：src，源字符串 参数2：start，从开始的位置隐藏，如果为空，则全部不隐藏，
	 * 参数3：end，结束位置，如果为空或为-1，则直到末尾都隐藏，如果超过源字符串长度，则只到末尾 返回值：隐藏结果
	 */
	public static String hidden(String src, Integer start, Integer end) {
		if(!hasText(src))
			return "要隐藏的字符串不能为空";
		if(!(src.length()>=start || src.length()>=end || start<end))
			return "参数有误";
		//要隐藏的字符串
		String hiddenStr = src.substring(start, end);
		  String strXX="";
		  for (int i = 0; i < hiddenStr.length(); i++) {
			  strXX+="*";
		}
		 String prefix=src.substring(0, start);//原字符串的头
		 String suffix=src.substring(end);//原字符串的尾
		  
		  
		  
		return   prefix +strXX+suffix;
	}
}
